Documentation
LCML/HTTP
cookieget
cookieget - Получение значения или свойства cookie
Метод
Part: LCML/HTTP
Функция cookieGet извлекает значение или указанное свойство cookie по его имени из HTTP-запроса.
Формат:
cookieGet name field request
name - имя cookie.
field - название свойства cookie (опционально).
EXPIRES - возвращает время истечения срока действия cookie.
MAXAGE - возвращает максимальный возраст cookie в секундах.
PATH - возвращает путь, для которого действителен cookie.
SECURE - возвращает флаг безопасности (true/false).
по умолчанию - возвращает значение cookie.
request - HTTP-запрос (http.Request), содержащий cookie. Результат:
Возвращает значение cookie или указанное свойство. Если cookie не найдено, возвращается текст ошибки.
Пример использования:
{{ $ticketUid := cookieget "ticket" "" $.Value.Request }}
cookieset
cookieset - Установка cookie в HTTP-ответе
Метод
Part: LCML/HTTP
Функция cookieSet устанавливает cookie с заданными параметрами в HTTP-ответ.
Формат:
cookieSet name value ttl response
name - имя cookie.
value - значение cookie.
ttl - время жизни cookie в формате time.Duration (например, “1h”, “30m”).
response - HTTP-ответ (http.ResponseWriter), в который будет добавлено cookie. Результат:
Возвращает пустую строку, если cookie успешно установлено. В случае ошибки парсинга времени жизни ( ttl ) возвращает описание ошибки.
Пример использования:
{{ cookieset "ticket" $uidTicket "2592000s" $.RespWriter }}
curl
curl - Отправка HTTP-запроса
Метод
Part: LCML/HTTP
Функция curl выполняет HTTP-запрос с заданными параметрами. Она поддерживает передачу заголовков, тела запроса и cookie. Если ответ не содержит данных ( res.Data пуст), функция возвращает “сырые” данные ответа.
Формат:
curl method url bodyJSON headers cookies
method - HTTP-метод запроса (GET, POST, PUT, и т. д.).
url - URL, на который отправляется запрос.
bodyJSON - тело запроса в формате JSON.
headers - мапа заголовков, где ключи - имена заголовков, а значения - их содержимое.
cookies - массив мапок, представляющих cookie. Результат:
Данные из ответа ( res ), если поле res.Data содержит значения.
“Сырые” данные ( raw ), если res.Data пуст. Пример использования:
{{ curl "GET" $exampleUrl "" nil nil }}
parsebody
parsebody - Чтение и обработка тела HTTP-запроса
Метод
Part: LCML/HTTP
Функция parseBody предназначена для чтения содержимого тела HTTP-запроса и его преобразования в указанный формат. Полезна при работе с API-запросами или при обработке данных от клиента.
Формат:
parsebody request format
request — HTTP-запрос, тело которого необходимо обработать.
format — формат, в который требуется преобразовать данные (по умолчанию возвращает содержимое тела запроса в виде строки). Результат:
Возвращает десериализованный объект или строку в зависимости от заданного формата. В случае ошибок возвращает сообщение об ошибке.
Пример использования:
{{ $formData := parsebody $.Request "json" }}
{{ $name := index $formData "name" }}
{{ $email := index $formData "email" }}
{{ $message := index $formData "message" }}
Тело запроса (JSON):
{
"name": "Иван Ловецкий",
"email": "ivan.lovetsky@example.com",
"message": "Хотелось бы узнать больше о курсе по программированию на Golang."
}
Результат: Если данные корректны, выводится сообщение благодарности с данными пользователя.
parseform
parseform -
Метод
Part: LCML/HTTP
Функция parseForm извлекает данные из формы, отправленной в HTTP-запросе, и преобразует их в карту, где каждому ключу сопоставлен массив значений.
Формат:
parseform request
- request — HTTP-запрос (объект http.Request), содержащий данные формы. Результат:
Возвращает карту ( map[string][]string ), где ключи — имена полей формы, а значения — массив значений, соответствующих каждому ключу. Если возникает ошибка при обработке данных формы, возвращается nil.
Пример использования:
{{ $formData := parseform $.Request }}
{{ $name := index $formData "name" }}
{{ $email := index $formData "email" }}
{{ $course := index $formData "course" }}
Тело формы (отправленное POST-запросом):
name=Иван Ловецкий
email=ivan.lovetsky@example.com
course=Программирование на Golang
Результат: Получение информации о регистрации пользователя для курса программирования на Golang.
parseformsep
parseformsep -
Метод
Part: LCML/HTTP
Функция parseformsep предназначена для обработки значений из HTTP-запроса и их преобразования в карту ( map ), где ключ — это имя параметра, а значение — строка, содержащая значения этого параметра, объединённые указанным разделителем.
Формат:
parseformsep request separator
- request — HTTP-запрос (объект http.Request), содержащий данные формы.
- separator — Разделитель, используемый для объединения значений (по умолчанию, ). Результат:
Возвращает map[string]string, где ключи — это названия полей из формы, а значения — строки, объединённые указанным разделителем.
Пример использования:
Входной HTTP-запрос содержит следующие данные формы:
name: [Ivan, Katerina]
course: [Golang, Javascript]
email: [ivan.lovetsky@example.com, katerina.zakharova@example.com]
Шаблон:
{{ $formData := parseformsep $.Request ";" }}
Имя: {{ index $formData “name” }}
Курсы: {{ index $formData “course” }}
Email: {{ index $formData “email” }}
>>
<p>Имя: Ivan;Katerina</p>
<p>Курсы: Golang;Javascript</p>
<p>Email: ivan.lovetsky@example.com;katerina.zakharova@example.com</p>
parseuseragent
parseuseragent - Функция parseuseragent анализирует строку заголовка User-Agent, извлекая различные параметры, такие как название приложения, версия, операционная система, тип устройства и статус (мобильное ли это устройство, планшет или бот).
Метод
Part: LCML/HTTP
Функция возвращает строковое значение, соответствующее запрашиваемому параметру.
Формат:
parseUserAgent header param
header (тип: string) — строка, содержащая заголовок User-Agent, который необходимо разобрать.
param (тип: string) — параметр, значение которого требуется вернуть. Возможные значения param:
“Name” — Название приложения или браузера.
“Version” — Версия приложения или браузера.
“OS” — Название операционной системы устройства.
“OSVersion” — Версия операционной системы устройства.
“Device” — Тип устройства (например, мобильный телефон, планшет или десктоп).
“isMobile” — true, если это мобильное устройство.
“isTablet” — true, если это планшет.
“isBot” — true, если это бот.
“isDesktop” — true, если это десктоп. Результат:
Возвращаемое значение — строка, соответствующая значению для запрашиваемого параметра.Если параметр не найден, возвращается пустая строка.
Пример:
{{$platform := parseUserAgent (index (index $.Value.Request.Header "User-Agent") 0) "OS" }}
profile
profile - Получение профиля пользователя
Метод
Part: LCML/HTTP
Функция profile извлекает данные о текущем профиле пользователя из контекста HTTP-запроса, затем парсит эти данные в структуру models.ProfileData.
**Формат**
profile r
- r (http.Request) — HTTP-запрос, в котором содержится информация о текущем профиле пользователя в контексте. Результат
Возвращает структуру данных models.ProfileData, содержащую информацию о профиле пользователя. Если произошла ошибка при парсинге или если профиль отсутствует, возвращается пустая структура.
Пример использования
profileuid
profileuid - Получение UID профиля по UID роли
Метод
Part: LCML/HTTP
Формат
profileuid r roleuid
r (http.Request) — HTTP-запрос, содержащий информацию о профиле пользователя.
roleuid (string) — UID роли, связанной с профилем. Если пусто, возвращается UID текущей роли. Результат
Возвращает строку — UID профиля, связанного с указанной ролью.
Пример использования
{{ $p := profileuid $.Value.Request $role }}
proxyrequest
proxyRequest — выполняет проксирование HTTP запросов на указанный адрес
Метод
Part: LCML/HTTP
Функция позволяет делать запросы различных типов (GET, POST, PUT, DELETE и т.д.) с возможностью передачи заголовков и тела запроса, а затем возвращает структурированный ответ для использования в шаблоне.
Формат запроса:
proxyRequest method targetURL headers body
Параметры - method (string) - HTTP метод запроса (GET, POST, PUT, DELETE, PATCH и т.д.) - targetURL (string) - Полный URL адрес для проксирования - headers map[string]string - Заголовки запроса в формате ключ-значение - body (string) - Тело запроса (для методов POST, PUT, PATCH)
Формат ответа
interface{} error
Функция возвращает map с полями: - status (string) HTTP статус ответа (например, “200 OK”) - statusCode (int) Числовой код статуса (200, 404, 500 и т.д.) - headers (http.Header) Заголовки ответа - body (HTML) Тело ответа, помеченное как безопасный HTML - bodyString (string) Тело ответа в виде обычной строки - error (string) Сообщение об ошибке (если произошла)
Примеры использования:
Базовый GET запрос
{{ $result := proxyRequest "GET" "https://jsonplaceholder.typicode.com/posts/1" nil "" }}
{{ if $result.error }}
<div class="error">Ошибка: {{ $result.error }}</div>
{{ else }}
<div class="response">
<h3>Статус: {{ $result.status }}</h3>
<pre>{{ $result.bodyString }}</pre>
</div>
{{ end }}
GET запрос с заголовками
{{ $headers := dict
"Authorization" "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
"Accept" "application/json"
"X-Custom-Header" "custom-value"
}}
{{ $userData := proxyRequest "GET" "https://api.example.com/user/profile" $headers "" }}
<div class="user-profile">
{{ if eq $userData.statusCode 200 }}
<p>Имя пользователя: {{ $userData.bodyString }}</p>
{{ else if eq $userData.statusCode 401 }}
<p>Ошибка авторизации. Пожалуйста, войдите снова.</p>
{{ else }}
<p>Ошибка загрузки профиля: {{ $userData.statusCode }}</p>
{{ end }}
</div>
POST запрос с JSON данными
{{ $postData := dict
"title" "Новая статья"
"content" "Содержание статьи"
"author" "Иван Иванов"
}}
{{ $jsonBody := $postData | jsonEncode }}
{{ $headers := dict
"Content-Type" "application/json"
"Accept" "application/json"
}}
{{ $result := proxyRequest "POST" "https://api.example.com/articles" $headers $jsonBody }}
{{ if eq $result.statusCode 201 }}
<div class="success">
<h3>Статья успешно создана!</h3>
<p>Ответ сервера: {{ $result.bodyString }}</p>
</div>
{{ else }}
<div class="error">
<h3>Ошибка создания статьи</h3>
<p>Код: {{ $result.statusCode }}</p>
<p>Сообщение: {{ $result.bodyString }}</p>
</div>
{{ end }}
POST форма с application/x-www-form-urlencoded
{{ $formData := dict
"username" .Form.Username
"password" .Form.Password
"remember" "true"
}}
{{ $formBody := "" }}
{{ range $key, $value := $formData }}
{{ $formBody = printf "%s%s=%s&" $formBody $key $value }}
{{ end }}
{{ $formBody = $formBody | trimSuffix "&" }}
{{ $headers := dict "Content-Type" "application/x-www-form-urlencoded" }}
{{ $loginResult := proxyRequest "POST" "https://api.example.com/login" $headers $formBody }}
{{ if eq $loginResult.statusCode 200 }}
<div class="success">Вход выполнен успешно!</div>
{{ else }}
<div class="error">Ошибка входа: {{ $loginResult.bodyString }}</div>
{{ end }}
PUT запрос для обновления данных
{{ $updateData := dict
"id" .Article.ID
"title" .Article.NewTitle
"status" "published"
}}
{{ $jsonBody := $updateData | jsonEncode }}
{{ $headers := dict
"Content-Type" "application/json"
"Authorization" (printf "Bearer %s" .User.Token)
}}
{{ $result := proxyRequest "PUT"
(printf "https://api.example.com/articles/%d" .Article.ID)
$headers
$jsonBody
}}
<div class="update-status">
{{ if eq $result.statusCode 200 }}
<p class="success">✓ Статья успешно обновлена</p>
{{ else }}
<p class="error">✗ Ошибка обновления: {{ $result.bodyString }}</p>
{{ end }}
</div>
DELETE запрос
{{ $headers := dict
"Authorization" (printf "Bearer %s" .User.Token)
"X-CSRF-Token" .CSRFToken
}}
{{ $result := proxyRequest "DELETE"
(printf "https://api.example.com/posts/%s" .PostID)
$headers
""
}}
<div class="delete-result">
{{ if eq $result.statusCode 204 }}
<p class="success"> Пост успешно удален</p>
{{ else if eq $result.statusCode 404 }}
<p class="error"> Пост не найден</p>
{{ else }}
<p class="error"> Ошибка удаления ({{ $result.statusCode }})</p>
{{ end }}
</div>
Расширенные операции
Обработка различных типов ответов
{{ $apiResponse := proxyRequest "GET" "https://api.github.com/users/golang/repos" nil "" }}
{{ if not $apiResponse.error }}
{{ if eq $apiResponse.statusCode 200 }}
{{/* Проверяем Content-Type для правильной обработки */}}
{{ $contentType := index $apiResponse.headers "Content-Type" }}
{{ if contains $contentType "application/json" }}
<div class="json-data">
<h3>JSON ответ:</h3>
<pre>{{ $apiResponse.bodyString }}</pre>
</div>
{{ else if contains $contentType "text/html" }}
<div class="html-data">
<h3>HTML ответ:</h3>
{{ $apiResponse.body }}
</div>
{{ else }}
<div class="raw-data">
<h3>Данные:</h3>
<pre>{{ $apiResponse.bodyString }}</pre>
</div>
{{ end }}
{{ else }}
<p>Ошибка API: {{ $apiResponse.status }}</p>
{{ end }}
{{ end }}
Составные запросы с несколькими вызовами
{{/* Сначала получаем данные пользователя */}}
{{ $userHeaders := dict "Authorization" (printf "Bearer %s" .Token) }}
{{ $user := proxyRequest "GET" "https://api.example.com/user" $userHeaders "" }}
{{ if eq $user.statusCode 200 }}
{{/* Затем получаем посты пользователя */}}
{{ $posts := proxyRequest "GET"
(printf "https://api.example.com/users/%s/posts" .UserID)
$userHeaders
""
}}
{{/* Наконец, получаем комментарии к постам */}}
{{ if eq $posts.statusCode 200 }}
{{ $comments := proxyRequest "GET"
(printf "https://api.example.com/posts/%s/comments" .FirstPostID)
$userHeaders
""
}}
<div class="dashboard">
<h2>Профиль: {{ $user.bodyString }}</h2>
<h3>Посты: {{ len $posts.bodyString }}</h3>
<h4>Последние комментарии: {{ $comments.bodyString }}</h4>
</div>
{{ end }}
{{ else }}
<div class="error">Ошибка авторизации</div>
{{ end }}
proxystream
proxyStream — это функция для проксирования потоковых данных непосредственно в HTTP ответ.
Метод
Part: LCML/HTTP
В отличие от proxyRequest, которая возвращает данные для использования в шаблоне, proxyStream предназначена для прямого проксирования больших объемов данных (файлы, видео, аудио, стриминг) без загрузки всего содержимого в память.
Формат запроса:
proxyStream w targetURL addRequestHeaders addResponseHeaders
Параметры - w (вставьте $.RespWriter) - ResponseWriter текущего HTTP запроса - targetURL (string) - Полный URL адрес для проксирования - addRequestHeaders, addResponseHeaders - map[string]string - мапы для добавления/замены заголовков в запрос/ответ
Возвращаемое значение - error - Ошибка в случае неудачи (nil при успешном проксировании)
Особенности
- Потоковая передача: Данные передаются напрямую без буферизации в памяти
- Сохранение заголовков: Все заголовки от целевого сервера копируются в ответ
- Сохранение статус кода: HTTP статус код проксируется без изменений
- Эффективность: Минимальное использование памяти, подходит для больших файлов
Примеры использования
{{ $videoURL := "http://video.com/dog.mpeg" }}
{{ proxyStream respWriter $videoURL nil nil}}
redirect
redirect - Перенаправление пользователя на указанный URL
Метод
Part: LCML/HTTP
Функция redirect выполняет перенаправление HTTP-запроса на указанный URL с определенным статусным кодом.
Формат:
redirect writer request url statusCode
writer ( http.ResponseWriter ) — объект для записи HTTP-ответа.
request ( http.Request ) — объект HTTP-запроса, вызывающего перенаправление.
url — строка, содержащая URL, на который должно произойти перенаправление.
statusCode — целое число, статус кода перенаправления (например, 302 для временного перенаправления). Результат:
Функция не возвращает результатов. Пользователь перенаправляется на указанный URL.
Пример использования:
{{ redirect $.Writer $.Request "/new-page" 302 }}
Пользователь регистрируется на образовательной платформе и после успешного завершения регистрации перенаправляется на страницу курсов:
{{ redirect $.Writer $.Request "/courses" 302 }}
urljoin
urljoin - Функция urljoin собирает URL-строку из словаря.
Метод
Part: LCML/HTTP
Формат
urljoin dict
dict: map с ключами, определенными функцией urlParse. Результат
Возвращает строку URL, собранную из словаря.
Если ключи отсутствуют, используются пустые строки.
Если значение userinfo содержит недопустимые данные, возникает паника. Пример использования
{{ $dict := dict “scheme” “https” “host” “host.com:8080” “path” “/path” “query” “query=1” “fragment” “frag” “userinfo” “user:pass” }} {{ $result := urljoin $dict }} {{ $result }} >> https://user:pass@host.com:8080/path?query=1#frag
urlparse
urlparse - Функция urlparse преобразует URL-строку в словарь, содержащий его составляющие.
Метод
Part: LCML/HTTP
Формат
urlparse url
- url: строка URL. Результат
Возвращает map с ключами:
scheme: схема URL.
host: полный хост (включая порт).
hostname: хост без порта.
path: путь URL.
query: строка запроса.
opaque: непрозрачная часть URL.
fragment: фрагмент (якорь).
userinfo: информация о пользователе (имя и пароль). Пример использования
{{ $result := urlparse “https://user:pass@host.com:8080/path?query=1” }} {{ $result }} >> map[scheme:https host:host.com:8080 hostname:host.com path:/path query:query=1 userinfo:user:pass]
xrealip
xrealip - Получение IP-адреса из HTTP-запроса
Метод
Part: LCML/HTTP
Функция xrealip извлекает IP-адрес клиента из заголовков HTTP-запроса или, если заголовки отсутствуют, из адреса удаленного подключения.
Формат:
xRealIp r
- r — объект HTTP-запроса (http.Request). Пример:
Возвращает строку с IP-адресом, полученным из:
Заголовка X-Real-Ip.
Если X-Real-Ip отсутствует — заголовка X-Forwarded-For.
Если оба заголовка отсутствуют — из свойства RemoteAddr объекта HTTP-запроса.